package p11_aop之jdk和cglib代理;

import java.lang.reflect.Proxy;

/**
 * spring的aop实现原理之一是动态代理
 * 本节介绍jdk提供的动态代理，这方式生成的代理类是接口的实现类，所以必须要有接口
 */
public class _1_JdkProxy {
    public static void main(String[] args) {
        /**
         * 通过Proxy的newProxyInstance生成代理类，有三个参数
         *  1.类加载器对象 2.要实现的接口数组 3.回调函数(每调用一次方法，就会执行这个函数)
         * 回调函数也有三个参数
         *  1.代理类本身 2.正在调用的方法对象，方法传进来的参数
         *
         * 在代理类内部调用目标类，就可以实现aop的增强
         * 这种模式，代理类和目标类都实现了同一个接口，他们是兄弟关系
         */
        Target t = new Target();
        Foo oo = (Foo)Proxy.newProxyInstance(_1_JdkProxy.class.getClassLoader(), new Class[]{Foo.class}, (p, method, arg)->{
            System.out.println("before...");
            //反射调用目标类
            Object r = method.invoke(t, arg);
            System.out.println("after...");
            return r;
        });
        System.out.println(oo.foo());
    }


}
